You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.6 KiB
40 lines
1.6 KiB
import log4js from "logger";
|
|
import { oauthManager } from '#server/service/oauth/oauth-manager';
|
|
import { setSessionCookie } from '#server/service/auth/cookie';
|
|
import { OAuthError } from '#server/service/oauth/oauth-error';
|
|
import { FRONTEND_LOGIN_PATH } from "common/config"
|
|
|
|
const logger = log4js.getLogger("OAUTH");
|
|
|
|
export default defineWrappedResponseHandler(async (event) => {
|
|
const providerName = getRouterParam(event, 'provider');
|
|
const query = getQuery(event);
|
|
|
|
const { code, state } = query as { code?: string; state?: string };
|
|
|
|
logger.info(`[callback] Received callback: provider=${providerName}, hasCode=${!!code}, hasState=${!!state}`);
|
|
|
|
if (query.error) {
|
|
logger.warn(`[callback] Provider returned error: ${query.error}, description=${query.error_description ?? '-'}`);
|
|
}
|
|
|
|
if (!code || !state) {
|
|
logger.warn(`[callback] Missing params: code=${!!code}, state=${!!state}`);
|
|
return sendRedirect(event, `${FRONTEND_LOGIN_PATH}?oauth_error=missing_params`);
|
|
}
|
|
|
|
try {
|
|
const result = await oauthManager.handleCallback(providerName!, code, state);
|
|
|
|
if (result.sessionId) {
|
|
setSessionCookie(event, result.sessionId);
|
|
}
|
|
|
|
logger.info(`[callback] Success: provider=${providerName}, isNewUser=${result.isNewUser}, hasSession=${!!result.sessionId}`);
|
|
return sendRedirect(event, `${FRONTEND_LOGIN_PATH}?oauth_success=1`);
|
|
} catch (error) {
|
|
const errorCode = error instanceof OAuthError ? error.code : 'OAUTH_UNKNOWN';
|
|
logger.error(`[callback] Failed: provider=${providerName}, errorCode=${errorCode}`, error);
|
|
return sendRedirect(event, `${FRONTEND_LOGIN_PATH}?oauth_error=${errorCode}`);
|
|
}
|
|
});
|